home *** CD-ROM | disk | FTP | other *** search
/ Aminet 44 / Aminet 44 (2001)(GTI - Schatztruhe)[!][Aug 2001].iso / Aminet / dev / moni / systemviewer.lha / SysPorts.c < prev    next >
C/C++ Source or Header  |  2001-04-25  |  16KB  |  680 lines

  1. /****h* SysPorts/SysPorts.c [1.1] ***********************************
  2. *
  3. * NAME
  4. *    SysPorts.c
  5. *
  6. * DESCRIPTION
  7. *
  8. *********************************************************************
  9. *
  10. */
  11.  
  12. #include <string.h>
  13.  
  14. #include <exec/types.h>
  15. #include <exec/execbase.h>
  16.  
  17. #include <AmigaDOSErrs.h>
  18.  
  19. #include <intuition/intuition.h>
  20. #include <intuition/classes.h>
  21. #include <intuition/classusr.h>
  22. #include <intuition/gadgetclass.h>
  23.  
  24. #include <libraries/gadtools.h>
  25.  
  26. #include <graphics/displayinfo.h>
  27. #include <graphics/gfxbase.h>
  28.  
  29. #include <clib/exec_protos.h>
  30. #include <clib/intuition_protos.h>
  31. #include <clib/gadtools_protos.h>
  32. #include <clib/graphics_protos.h>
  33. #include <clib/utility_protos.h>
  34. #include <clib/diskfont_protos.h>
  35.  
  36. #include "CPGM:GlobalObjects/CommonFuncs.h"
  37.  
  38. #include "SysLists.h"
  39.  
  40. #define PLV       0
  41. #define Update    1
  42. #define RemoveBt  2
  43. #define Priority  3
  44. #define Cancel    4
  45.  
  46. #define Po_CNT    5
  47.  
  48. #define PORTLVGAD PoGadgets[ PLV ]
  49.  
  50. PRIVATE char ver[] = "\0$VER: SysPorts 1.1 (25-Apr-2001) by J.T. Steichen\0";
  51.  
  52. PRIVATE struct TextFont     *PoFont  = NULL;
  53. PRIVATE struct Window       *PoWnd   = NULL;
  54. PRIVATE struct Gadget       *PoGList = NULL;
  55. PRIVATE struct IntuiMessage  PoMsg;
  56. PRIVATE struct Gadget       *PoGadgets[ Po_CNT ];
  57.  
  58. PRIVATE UWORD  PoLeft   = 0;
  59. PRIVATE UWORD  PoTop    = 16;
  60. PRIVATE UWORD  PoWidth  = 635;
  61. PRIVATE UWORD  PoHeight = 230;
  62. PRIVATE UBYTE *PoWdt    = (UBYTE *) "System Info (Ports):";
  63.  
  64. PRIVATE char *ltitle = "Address   Pri  PortName            Type     SigBit   Flags TaskName";
  65. PRIVATE char *fmt    = "%08LX %4d  %-19.19s %-7.7s  %08LX  %4LX %-24.24s";
  66.  
  67. PRIVATE ULONG PortAddress = 0L;
  68.  
  69. PRIVATE char  pn[80], *PortName = &pn[0];
  70.  
  71. PRIVATE struct List *DevListPtr = NULL;
  72.  
  73. // -------------------------------------------------------------------
  74.  
  75. #define MAXNODES   50
  76. #define NODELENGTH 80
  77.  
  78. PRIVATE struct List PLVList;
  79.  
  80. PRIVATE struct Node PLVNode;
  81. PRIVATE struct Node PLVNodes[ MAXNODES ] = { NULL, };
  82.  
  83. PRIVATE UBYTE       NodeStrs[ MAXNODES * NODELENGTH ] = "";
  84.  
  85. PRIVATE struct ListViewMem lvm = { 0, };
  86.     
  87. // -------------------------------------------------------------------
  88.  
  89. PRIVATE UWORD PoGTypes[] = {
  90.  
  91.    LISTVIEW_KIND, BUTTON_KIND, BUTTON_KIND,
  92.    BUTTON_KIND,   BUTTON_KIND
  93. };
  94.  
  95. PRIVATE int PLVClicked(      int whichitem );
  96. PRIVATE int UpdateClicked(   int dummy     );
  97. PRIVATE int RemoveClicked(   int dummy     );
  98. PRIVATE int PriorityClicked( int dummy     );
  99. PRIVATE int CancelClicked(   int dummy     );
  100.  
  101. PRIVATE struct NewGadget PoNGad[] = {
  102.  
  103.      2,   3, 627, 200,                 NULL, NULL, PLV, 
  104.    0, NULL, (APTR) PLVClicked,
  105.  
  106.      6, 205,  72,  17, (UBYTE *) "_Update",  NULL, Update, 
  107.    PLACETEXT_IN, NULL, (APTR) UpdateClicked,
  108.  
  109.    192, 205,  72,  17, (UBYTE *) "Remove",   NULL, RemoveBt, 
  110.    PLACETEXT_IN, NULL, (APTR) RemoveClicked,
  111.  
  112.    379, 205,  72,  17, (UBYTE *) "Priority", NULL, Priority, 
  113.    PLACETEXT_IN, NULL, (APTR) PriorityClicked,
  114.  
  115.    552, 205,  72,  17, (UBYTE *) "_Cancel",  NULL, Cancel, 
  116.    PLACETEXT_IN, NULL, (APTR) CancelClicked
  117. };
  118.  
  119. PRIVATE ULONG PoGTags[] = {
  120.  
  121.    LAYOUTA_Spacing,      2, 
  122.    GTLV_ShowSelected, NULL, 
  123.    GTLV_Selected,     TRUE, TAG_DONE,
  124.  
  125.    GT_Underscore,  '_', TAG_DONE,
  126.    TAG_DONE,
  127.    TAG_DONE,
  128.    GT_Underscore,  '_', TAG_DONE
  129. };
  130.  
  131. // ----------------------------------------------------------------------
  132.  
  133. PRIVATE char PortType[20] = "";
  134. PRIVATE char PortTask[32] = "";
  135.  
  136. PRIVATE ULONG PortSigBit = 0L;
  137. PRIVATE UBYTE PortFlags  = 0L;
  138.  
  139. PRIVATE char *GetPortType( struct Node *port )
  140. {
  141.    switch (port->ln_Type)
  142.       {
  143.       case NT_MSGPORT:
  144.          strcpy( &PortType[0], "MsgPort" );
  145.          break;
  146.          
  147.       case NT_UNKNOWN:
  148.       default:
  149.          strcpy( &PortType[0], "Unknown" );
  150.          break;
  151.       }
  152.       
  153.    return( &PortType[0] );
  154. }
  155.  
  156. PRIVATE ULONG GetPortSigBit( struct Node *port )
  157. {
  158.    struct MsgPort *mp = (struct MsgPort *) port;
  159.  
  160.    return( mp->mp_SigBit = PortSigBit );
  161. }
  162.  
  163. PRIVATE UBYTE GetPortFlags( struct Node *port )
  164. {
  165.    struct MsgPort *mp = (struct MsgPort *) port;
  166.    
  167.    return( mp->mp_Flags = PortFlags );
  168. }
  169.  
  170. PRIVATE char *GetPortTaskName( struct Node *port )
  171. {
  172.    struct MsgPort *mp    = (struct MsgPort *) port;
  173.    struct Task    *ptask = NULL;
  174.    
  175.    if (mp != NULL)
  176.       ptask = (struct Task *) mp->mp_SigTask;
  177.  
  178.    if (ptask != NULL)
  179.       { 
  180.       if (ptask->tc_Node.ln_Type == NT_TASK ||
  181.           ptask->tc_Node.ln_Type == NT_PROCESS)
  182.          {
  183.          if (strlen( ptask->tc_Node.ln_Name ) > 1)   
  184.             strcpy( &PortTask[0], ptask->tc_Node.ln_Name );
  185.          else
  186.             strcpy( &PortTask[0], "No Task Name!" );  
  187.          } 
  188.       else
  189.          strcpy( &PortTask[0], "No Task Node!" );   
  190.       }
  191.    else
  192.       strcpy( &PortTask[0], "No Task Ptr!" );   
  193.  
  194.    return( &PortTask[0] );
  195. }
  196.  
  197. PRIVATE BOOL ValidName( char *name )
  198. {
  199.    BOOL rval = TRUE;
  200.    int  len  = strlen( name ), i = 0;
  201.  
  202.    if (len < 1)
  203.       {
  204.       rval = FALSE;
  205.       return( rval );
  206.       }
  207.  
  208.    while (i < len)
  209.       {
  210.       if ((*(name + i) > 0x7E) || (*(name + i) < 0x20))
  211.          {
  212.          rval = FALSE;
  213.          break;
  214.          }
  215.  
  216.       i++;
  217.       }   
  218.  
  219.    return( rval );
  220. }
  221.  
  222. PRIVATE int MakePortList( void )
  223. {
  224.    IMPORT struct ExecBase *SysBase;
  225.  
  226.    struct List    *portslist;
  227.    struct Node    *ptr;   
  228.    struct MsgPort *mport;
  229.    
  230.    char *nm = NULL;
  231.    int   i  = 1; // Don't overwrite the Column headers.
  232.    
  233.    // First node is column heads:   
  234.    strncpy( &NodeStrs[0], ltitle, NODELENGTH - 1 );
  235.    
  236.    HideListFromView( PORTLVGAD, PoWnd );
  237.  
  238.    Forbid();
  239.  
  240.      portslist = &SysBase->PortList;
  241.      ptr       = portslist->lh_Head;
  242.      mport     = (struct MsgPort *) ptr;
  243.  
  244.      while ((i < MAXNODES) && (mport != NULL))
  245.         {
  246.         nm = mport->mp_Node.ln_Name;
  247.  
  248.         if (strlen( nm ) < 1)
  249.            goto SkipBlankPortName;
  250.  
  251.         // "Address  Pri  PortName  Type  SigBit  Flags TaskName";
  252.         sprintf( &NodeStrs[ NODELENGTH * i++ ], fmt,
  253.                  mport, 
  254.                  mport->mp_Node.ln_Pri,
  255.                  (nm == NULL ? "** NO NAME **" : nm),
  256.                  GetPortType(     (struct Node *) mport ),
  257.                  mport->mp_SigBit,
  258.                  mport->mp_Flags,
  259.                  GetPortTaskName( (struct Node *) mport )
  260.                );
  261.  
  262. SkipBlankPortName:
  263.          
  264.         mport = ((struct MsgPort *) mport)->mp_Node.ln_Succ;
  265.         } 
  266.  
  267.    Permit();
  268.  
  269.    GT_SetGadgetAttrs( PORTLVGAD, PoWnd, NULL,
  270.                       GTLV_Labels,       &PLVList,
  271.                       GTLV_Selected,     1,
  272.                       TAG_END
  273.                     );
  274.  
  275.    DisplayTitle( PoWnd, PoWdt );
  276.  
  277.    return( i );
  278. }
  279.  
  280.  
  281. PRIVATE void ClosePoWindow( void )
  282. {
  283.    if (PoWnd != NULL)
  284.       {
  285.       CloseWindow( PoWnd );
  286.       PoWnd = NULL;
  287.       }
  288.  
  289.    if (PoGList != NULL)
  290.       {
  291.       FreeGadgets( PoGList );
  292.       PoGList = NULL;
  293.       }
  294.  
  295.    if (PoFont != NULL)
  296.       {
  297.       CloseFont( PoFont );
  298.       PoFont = NULL;
  299.       }
  300.  
  301.    return;
  302. }
  303.  
  304. PRIVATE int PoCloseWindow( void )
  305. {
  306.    ClosePoWindow();
  307.    return( (int) FALSE );
  308. }
  309.  
  310. PRIVATE int PLVClicked( int itemnum )
  311. {
  312.    ULONG addr = 0L;
  313.    
  314. //#  ifdef DEBUG
  315. //   fprintf( stderr, "%-80.80s\n", PLVNodes[ itemnum ].ln_Name );
  316. //#  endif
  317.  
  318.    if (itemnum == 0)   
  319.       {
  320.       GT_SetGadgetAttrs( PoGadgets[ RemoveBt ], PoWnd, NULL,
  321.                          GA_Disabled, TRUE, TAG_DONE 
  322.                        );
  323.  
  324.       GT_SetGadgetAttrs( PoGadgets[ Priority ], PoWnd, NULL,
  325.                          GA_Disabled, TRUE, TAG_DONE 
  326.                        );
  327.  
  328.       return( (int) TRUE );
  329.       }
  330.    else
  331.       {
  332.       GT_SetGadgetAttrs( PoGadgets[ RemoveBt ], PoWnd, NULL,
  333.                          GA_Disabled, FALSE, TAG_DONE 
  334.                        );
  335.  
  336.       GT_SetGadgetAttrs( PoGadgets[ Priority ], PoWnd, NULL,
  337.                          GA_Disabled, FALSE, TAG_DONE 
  338.                        );
  339.  
  340.       // Now get address from the item:
  341.       (void) stch_l( PLVNodes[ itemnum ].ln_Name, (long *) &addr );
  342.  
  343.       PortAddress = addr;
  344.       }
  345.  
  346.    return( (int) TRUE );
  347. }
  348.  
  349. PRIVATE int UpdateClicked( int dummy )
  350. {
  351.    int i;
  352.  
  353.    DisplayTitle( PoWnd, "Updating Port List..." );
  354.  
  355.    HideListFromView( PORTLVGAD, PoWnd );   
  356.  
  357.    for (i = 1; i < MAXNODES; i++)         // 0 = Title string in ListView
  358.        NodeStrs[ i * NODELENGTH ] = '\0'; // Kill old ListView strings.
  359.  
  360.    // Make the list:
  361.    (void) MakePortList();
  362.  
  363.    ModifyListView( PORTLVGAD, PoWnd, &PLVList, NULL );
  364.  
  365.    DisplayTitle( PoWnd, PoWdt );
  366.  
  367.    GT_RefreshWindow( PoWnd, NULL );
  368.  
  369.    return( (int) TRUE );
  370. }
  371.  
  372. // ---------------------------------------------------------------------
  373.  
  374. PRIVATE BOOL IsMsgPort_Empty( struct MsgPort *p )
  375. {
  376.    BOOL rval = FALSE;
  377.  
  378.    if (p == NULL)
  379.       return( TRUE );
  380.  
  381.    if (p->mp_MsgList.lh_TailPred == (struct Node *) &(p->mp_MsgList))
  382.       rval = TRUE;
  383.    
  384.    return( rval );
  385. }
  386.      
  387. PRIVATE void RemovePortSafely( struct MsgPort *port )
  388. {
  389.    struct Node *MsgNode = NULL;
  390.  
  391.    if (port == NULL)
  392.       return;
  393.  
  394.    Forbid();
  395.  
  396.      if (IsMsgPort_Empty( port ) == FALSE)
  397.         {
  398.         MsgNode = port->mp_MsgList.lh_Head;
  399.  
  400.         while ((MsgNode = MsgNode->ln_Succ) != NULL)
  401.            Remove( (struct Node *) MsgNode );
  402.         }
  403.  
  404.      if (port->mp_Node.ln_Name != NULL)
  405.         RemPort( port );
  406.  
  407.      port->mp_SigTask         = (struct Task *) -1;
  408.      port->mp_MsgList.lh_Head = (struct Node *) -1;
  409.  
  410.      DeletePort( port );
  411.  
  412.   Permit();
  413.  
  414.   return;
  415. }
  416.  
  417. PRIVATE int RemoveClicked( int dummy )
  418. {
  419.    int   answer = -1;
  420.  
  421.    if (PortAddress == NULL)
  422.       {
  423.       UserInfo( "Select a valid Port first!", "User ERROR:" );
  424.  
  425.       return( (int) TRUE );
  426.       }
  427.  
  428.    sprintf( ErrMsg, "Are you SURE you want to Remove %08x?", PortAddress );
  429.  
  430.    answer = SanityCheck( ErrMsg );
  431.  
  432.    if (answer == TRUE)
  433.       RemovePortSafely( (struct MsgPort *) PortAddress );
  434.  
  435.    return( (int) TRUE );
  436. }
  437.  
  438. // ---------------------------------------------------------------------
  439.  
  440. PRIVATE int PriorityClicked( int dummy )
  441. {
  442.    int  answer = -1;
  443.    
  444.    if (PortAddress == NULL)
  445.       {
  446.       UserInfo( "Select a valid Port first!", "User ERROR:" );      
  447.  
  448.       return( (int) TRUE );
  449.       }
  450.  
  451.    sprintf( ErrMsg, "Are you SURE you want to Re-Prioritize %08x?", 
  452.             PortAddress 
  453.           );
  454.  
  455.    answer = SanityCheck( ErrMsg );
  456.  
  457.    if (answer == TRUE)
  458.       {
  459.       ULONG  OldPri = ((struct Node *) PortAddress)->ln_Pri;
  460.       char  *name   = ((struct Node *) PortAddress)->ln_Name;
  461.  
  462.       if (ChangePriorityHandler( name, NT_MSGPORT, OldPri ) < 0)
  463.          {
  464.          // Error condition:
  465.          sprintf( ErrMsg, "Couldn't open Priority Requester!" );
  466.  
  467.          UserInfo( ErrMsg, "System Problem:" );
  468.          }
  469.       }
  470.  
  471.    return( (int) TRUE );
  472. }
  473.  
  474. PRIVATE int CancelClicked( int dummy )
  475. {
  476.    return( PoCloseWindow() );
  477. }
  478.  
  479. // -----------------------------------------------------------------
  480.  
  481. PRIVATE int OpenPoWindow( void )
  482. {
  483.    struct NewGadget  ng;
  484.    struct Gadget    *g;
  485.    UWORD             lc, tc;
  486.    UWORD             wleft = PoLeft, wtop = PoTop, ww, wh;
  487.  
  488.    ComputeFont( Scr, Font, &CFont, PoWidth, PoHeight );
  489.  
  490.    ww = ComputeX( CFont.FontX, PoWidth );
  491.    wh = ComputeY( CFont.FontY, PoHeight );
  492.  
  493.    if ((wleft + ww + CFont.OffX + Scr->WBorRight) > Scr->Width)
  494.       wleft = Scr->Width - ww;
  495.  
  496.    if ((wtop + wh + CFont.OffY + Scr->WBorBottom) > Scr->Height)
  497.       wtop = Scr->Height - wh;
  498.  
  499.    if ((PoFont = OpenDiskFont( Font )) == NULL)
  500.       return( -5 );
  501.  
  502.    if ((g = CreateContext( &PoGList )) == NULL)
  503.       return( -1 );
  504.  
  505.    for (lc = 0, tc = 0; lc < Po_CNT; lc++)
  506.       {
  507.       CopyMem( (char *) &PoNGad[lc], (char *) &ng, 
  508.                (long) sizeof( struct NewGadget )
  509.              );
  510.  
  511.       ng.ng_VisualInfo = VisualInfo;
  512.       ng.ng_TextAttr   = Font;
  513.  
  514.       ng.ng_LeftEdge   = CFont.OffX + ComputeX( CFont.FontX, 
  515.                                                 ng.ng_LeftEdge
  516.                                               );
  517.  
  518.       ng.ng_TopEdge    = CFont.OffY + ComputeY( CFont.FontY, 
  519.                                                 ng.ng_TopEdge
  520.                                               );
  521.  
  522.       ng.ng_Width      = ComputeX( CFont.FontX, ng.ng_Width );
  523.       ng.ng_Height     = ComputeY( CFont.FontY, ng.ng_Height );
  524.  
  525.       PoGadgets[lc] = g = CreateGadgetA( (ULONG) PoGTypes[lc], 
  526.                             g, 
  527.                             &ng, 
  528.                             (struct TagItem *) &PoGTags[tc] );
  529.  
  530.       while ( PoGTags[tc] )
  531.          tc += 2;
  532.  
  533.       tc++;
  534.  
  535.       if (g == NULL)
  536.          return( -2 );
  537.       }
  538.  
  539.    if ((PoWnd = OpenWindowTags( NULL,
  540.  
  541.                  WA_Left,        wleft,
  542.                  WA_Top,         wtop,
  543.                  WA_Width,       ww + CFont.OffX + Scr->WBorRight,
  544.                  WA_Height,      wh + CFont.OffY + Scr->WBorBottom,
  545.                  
  546.                  WA_IDCMP,       LISTVIEWIDCMP | BUTTONIDCMP 
  547.                    | IDCMP_CLOSEWINDOW | IDCMP_REFRESHWINDOW 
  548.                    | IDCMP_VANILLAKEY,
  549.                  
  550.                  WA_Flags,       WFLG_DRAGBAR | WFLG_DEPTHGADGET 
  551.                    | WFLG_CLOSEGADGET | WFLG_SMART_REFRESH 
  552.                    | WFLG_ACTIVATE | WFLG_RMBTRAP,
  553.                  
  554.                  WA_Gadgets,     PoGList,
  555.                  WA_Title,       PoWdt,
  556.                  WA_ScreenTitle, ScrTitle,
  557.                  TAG_DONE )
  558.       ) == NULL)
  559.       return( -4 );
  560.  
  561.    GT_RefreshWindow( PoWnd, NULL );
  562.  
  563.    return( 0 );
  564. }
  565.  
  566. PRIVATE int PoVanillaKey( int whichkey )
  567. {
  568.    int rval = TRUE;
  569.    
  570.    switch (whichkey)
  571.       {
  572.       case 'u':
  573.       case 'U':
  574.          rval = UpdateClicked( 0 );
  575.          break;
  576.                
  577.       case 'c':
  578.       case 'C':
  579.       case 'x':
  580.       case 'X':
  581.       case 'q':
  582.       case 'Q':
  583.          rval = CancelClicked( 0 );
  584.  
  585.       default:
  586.          break;
  587.       }
  588.  
  589.    return( rval );
  590. }
  591.  
  592. PRIVATE int HandlePoIDCMP( void )
  593. {
  594.    struct IntuiMessage  *m;
  595.    int                 (*func)( int code );
  596.    BOOL                  running = TRUE;
  597.  
  598.    while (running == TRUE)
  599.       {
  600.       if ((m = GT_GetIMsg( PoWnd->UserPort )) == NULL)
  601.          {
  602.          (void) Wait( 1L << PoWnd->UserPort->mp_SigBit );
  603.          continue;
  604.          }
  605.  
  606.       CopyMem( (char *) m, (char *) &PoMsg, 
  607.                (long) sizeof( struct IntuiMessage )
  608.              );
  609.  
  610.       GT_ReplyIMsg( m );
  611.  
  612.       switch (PoMsg.Class)
  613.          {
  614.          case IDCMP_REFRESHWINDOW:
  615.             GT_BeginRefresh( PoWnd );
  616.             GT_EndRefresh( PoWnd, TRUE );
  617.             break;
  618.  
  619.          case IDCMP_CLOSEWINDOW:
  620.             running = PoCloseWindow();
  621.             break;
  622.  
  623.          case IDCMP_VANILLAKEY:
  624.             running = PoVanillaKey( (int) PoMsg.Code ); 
  625.             break;
  626.              
  627.          case IDCMP_GADGETUP:
  628.          case IDCMP_GADGETDOWN:
  629.             func = (void *) ((struct Gadget *) PoMsg.IAddress)->UserData;
  630.  
  631.             if (func != NULL)
  632.                running = func( (int) PoMsg.Code );
  633.  
  634.             break;
  635.          }
  636.       }
  637.  
  638.    return( running );
  639. }
  640.  
  641. PUBLIC int main( void )
  642. {
  643.    int i = 0;
  644.  
  645.    if (SetupSystemList( &OpenPoWindow ) < 0)
  646.       {
  647.       fprintf( stderr, "Couldn't open a System ListViewer!\n" );
  648.       return( RETURN_FAIL );
  649.       }
  650.    
  651.    SetNotifyWindow( PoWnd );
  652.  
  653.    DisplayTitle( PoWnd, "Making Port List..." );
  654.  
  655.    lvm.lvm_NodeStrs   = &NodeStrs[0];
  656.    lvm.lvm_Nodes      = &PLVNodes[0];
  657.    lvm.lvm_NumItems   = MAXNODES;
  658.    lvm.lvm_NodeLength = NODELENGTH;
  659.  
  660.    SetupList( &PLVList, &lvm );   
  661.  
  662.    strcpy( PLVNodes[0].ln_Name, ltitle );
  663.  
  664.    (void) MakePortList(); // Make the list.
  665.  
  666.    ModifyListView( PORTLVGAD, PoWnd, (struct List *) &PLVList, NULL );
  667.  
  668.    GT_RefreshWindow( PoWnd, NULL );
  669.  
  670.    DisplayTitle( PoWnd, PoWdt );
  671.  
  672.    (void) HandlePoIDCMP();
  673.    
  674.    ShutdownSystemList();
  675.  
  676.    return( RETURN_OK );
  677. }
  678.  
  679. /* ---------------------- END of SysPorts.c file! -------------------- */ 
  680.